/**
 @file xbee_driver_def.h
 @brief Definición de los parámetros y estructuras de datos utilizadas en la interfaz con el dispositivo XBee.
 @date   25/11/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef XBEE_DRIVER_DEF_H_
#define XBEE_DRIVER_DEF_H_

#include <inttypes.h>
#include <pthread.h>


//!@brief El puerto serie donde se encuentra el módulo XBee, alguno de los /dev/ttyUSBx
#define SERIAL_PORT "/dev/xbee"

//!@brief Tiempo máximo de espera en seg por actividad en el puerto serie. La hebra que consulta el puerto duerme durante este periodo
#define FRAME_RCV_TIMEOUT_SEC 5

//! @brief Tiempo máximo de duración en useg de la lectura de una trama XBee desde el puerto serie
#define SERIAL_READ_TIMEOUT_USEC 2000

//! @brief Clave de la cola general de tramas entrantes
#define INPUT_QUEUE_KEY 0x666

//!@brief Clave de la cola general de tramas salientes
#define OUTPUT_QUEUE_KEY 0x777

//! @brief mtype para la cola de salida de los msjs transportando tramas de tipo TX_REQUEST_64
#define MQ_TX_REQUEST_64 0x641

//! @brief Tamaño máximo en bytes de una trama API XBee. Data + cabecera. Máximo de DATA recibido en cualquier trama API: 100 bytes
#define MAX_FRAME_SIZE 116

//! @brief Byte delimitador de tramas de la API XBee
#define API_DELIMITER 0x7E

//! @brief Contiene información de estado del dispositivo.
struct xbee_device {

    int serial_fd;  //!< descriptor del puerto serie
    int in_msqid;   //!< id de la cola general de tramas entrantes
    int out_msqid;  //!< id de la cola general de tramas salientes
    uint8_t *rbuf;  //!< buffer de entrada
    int good, acked; //!< cantidad de tramas recibidas y cantidad de ACKs de capa MAC recibidos

};

//! @brief Estructura para entregar una trama entrante a la capa superior.
struct rx_frame {

    uint8_t length; //!< tamaño de la data
    uint8_t api_id; //!< identificador API de la trama
    uint8_t data[MAX_FRAME_SIZE]; //!< contenedor de la data @see MAX_FRAME_SIZE
};

//! @brief Estructura para colocar una trama en la cola de entrada, requerida por SystemV.
struct msgbuf_rx {

    long mtype;
    struct rx_frame trama;
};

//! @brief Contiene la información de estado pertinente al servicio de entrada/salida de tramas XBee.
typedef struct {

    char r_thr_active;  //!< bandera para la activación de la hebra de polling al puerto serie
    char s_thr_active;  //!< bandera para la activación de la hebra que envía las tramas salientes
    char pro_thr_active;    //!< bandera para la activación de la hebra que procesa las tramas entrantes
    pthread_t r_thr, s_thr, proc_thr; //!< identificadores de dichas hebras
    struct xbee_device mod; //!< contenedor del dispositivo XBee en uso @see xbee_device
    //struct msgbuf_rx RX;

} xbee_svc_handler_t;

//! @brief Estructura de una trama general XBee saliente.
struct tx_frame {

    uint8_t length; //!< tamaño de la data
    uint8_t api_id; //!< identificador API de la trama
    uint16_t addr_16;   //!< dirección de destino de 16bits
    uint64_t addr_64;   //!< dirección de destino de 64bits
    uint8_t frameid;    //!< identificador de la trama
    uint8_t data[MAX_FRAME_SIZE];   //!< contenedor de la data @see MAX_FRAME_SIZE
};

//! @brief Estructura para enviar una trama a la cola de salida, requerida por SystemV.
struct msgbuf_tx {

    long mtype;
    struct tx_frame trama;
};


#endif /* XBEE_DRIVER_DEF_H_ */
